import java.awt.event.*;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.IOException;

import java.util.Vector;

@SuppressWarnings("serial")
public class Execution extends JPanel implements ActionListener {
	
	private JToolBar boiteOutil;
	//public JPanel terrain;
	private JButton enregistrer, hautparleur, afficherAnimal, zoomM, zoomP;
	private JComboBox vitesse, CZoom;	
	
	//private Box boite;
	private Font fond;
	
	private Vector<Dessinable> dessins;
	public Point startingPoint;
	public Point modifier;
	public int orientation;
	public int pas;
	public float epaisseur;
	public boolean dessine;
	public Color couleur;
	public Tortue turtle;
	
	//buffer capture d'ecran
	private BufferedImage capture;
	
	public Execution()
	{
		
		super();
		
		this.dessins = new Vector<Dessinable>();
		this.setLayout(new BorderLayout());
		this.setBackground(Color.WHITE);
		boiteOutil=new JToolBar();		
		
		//on definit un style		
		fond = new Font("Arial",Font.BOLD,10);				
				
		//on definit le bouton enregistrer
		enregistrer=new JButton();	
		
	
		//ImageIcon enregistrement =new ImageIcon(image[0]);		
		//enregistrer.setIcon(enregistrement);
		enregistrer.setText("Save");
		enregistrer.setBorder(BorderFactory.createTitledBorder(""));					
		boiteOutil.add(enregistrer);
		enregistrer.setToolTipText("Enregistrer");
		
		boiteOutil.add(Box.createRigidArea(new Dimension(5, 0))); //espace boutons JToolBar
		
		//on definit le bouton animal
		afficherAnimal=new JButton();
		
		//ImageIcon animal =new ImageIcon(image[1]);		
		//afficherAnimal.setIcon(animal);
		afficherAnimal.setText("View");
		afficherAnimal.setBorder(BorderFactory.createTitledBorder(""));					
		boiteOutil.add(afficherAnimal);
		afficherAnimal.setToolTipText("Afficher animal");
		
		boiteOutil.add(Box.createRigidArea(new Dimension(5, 0))); //espace boutons JToolBar
		
		//on definit le bouton hautparleur
		hautparleur=new JButton();
		
		//ImageIcon son =new ImageIcon(image[2]);		
		//hautparleur.setIcon(son);
		hautparleur.setText("Sound");
		hautparleur.setBorder(BorderFactory.createTitledBorder(""));					
		boiteOutil.add(hautparleur);
		hautparleur.setToolTipText("Activer son");
		
		boiteOutil.add(Box.createRigidArea(new Dimension(5, 0))); //espace boutons JToolBar
			
		//combobox vitesse
		String choixVitesse[] = {"Lent","Normal","Rapide"};
		vitesse=new JComboBox(choixVitesse);		
		vitesse.setBorder(BorderFactory.createTitledBorder(null,"Vitesse",0,0,fond));
		vitesse.setPreferredSize(new Dimension(50,25));
		boiteOutil.add(vitesse);
		
		boiteOutil.add(Box.createRigidArea(new Dimension(5, 0))); //espace boutons JToolBar
				
		//on definit le bouton zoom -			
		zoomM=new JButton();
		
		//ImageIcon zoomMoins =new ImageIcon(image[4]);		
		//zoomM.setIcon(zoomMoins);	
		zoomM.setText("-");
		zoomM.setBorder(BorderFactory.createTitledBorder(""));							
		boiteOutil.add(zoomM);
		zoomM.setToolTipText("Zoom -");				
			
		boiteOutil.add(Box.createRigidArea(new Dimension(5, 0))); //espace boutons JToolBar	
								
		//on definit le bouton zoom +			
		zoomP=new JButton();
		
		//ImageIcon zoomPlus =new ImageIcon(image[3]);		
		//zoomP.setIcon(zoomPlus);
		zoomP.setText("+");
		zoomP.setBorder(BorderFactory.createTitledBorder(""));					
		boiteOutil.add(zoomP);
		zoomP.setToolTipText("Zoom +");			
			
		//on definit la comboBox du zoom
				
		CZoom=new JComboBox();
		CZoom.setEditable(true);
		CZoom.setBorder(BorderFactory.createTitledBorder(null,"Zoom",0,0,fond));
		CZoom.setPreferredSize(new Dimension(50,25));
		boiteOutil.add(CZoom);
		
		boiteOutil.add(Box.createRigidArea(new Dimension(250, 0))); //espace boutons JToolBar
		
		
	
		//rendre la boite � outil visible
		boiteOutil.setVisible(true);
		//on ajoute la boite � outil 
		//this.add(boiteOutil, BorderLayout.SOUTH);
		
		//Initialisation de l'affichage graphique
		this.clearScreen();
	}
	
	public void actionPerformed(ActionEvent evt){}

	
	/*
	 * M�thodes et fonctions permettant le dessin dans la fen�tre EXECUTION 
	 */
	
	/*
	 * Initialisation de l'affichage
	 */
	public void init()
	{
		int y = 200;
		int x = 250;
		this.startingPoint 	= new Point(x,y);
		this.orientation 	= 0;
		this.pas 			= 10;
		this.epaisseur		= 1.0f;
		this.dessine		= true;
		this.couleur		= Color.blue;
		turtle = new Tortue(startingPoint,orientation);
		this.ajouterDessinable(turtle);
	}
	
	/*
	 * Efface l'�cran 
	 */
	public void clearScreen()
	{
		dessins.clear();
		this.init();	
	}

	//---------------------------------------------------------------
	/* Retourne le point de d�part de la figure qui va �tre dessiner */
	public Point getPoint(){return this.startingPoint;}
	
	/* Permet de sp�cifier le point de d�part de la prochaine figure */
	public void setPoint(Point p){this.startingPoint = p;}
	
	//---------------------------------------------------------------
	/* Retourne l'orientation de la tortue */
	public double getOrientation(){return turtle.orientation; }
	
	/* Permet de sp�cifier la direction de la tortue */
	public void setOrientation(double o){turtle.orientation = o; this.repaint();}

	//---------------------------------------------------------------
	/* Retourne la vitesse de dessin de la tortue */
	public int getPas() {return this.pas;}
	
	/* Permet de sp�cifier la vitesse de dessin de la tortue */
	public void setPas(int p) {this.pas = p;}
	
	//---------------------------------------------------------------
	/* Retourne l'�paisseur du crayon */
	public float getEpaisseur() {return this.epaisseur;}
	
	/* Permet de sp�cifier l'epaisseur du crayon */
	public void setEpaisseur(float e) {this.epaisseur = e;}
	
	//---------------------------------------------------------------
	/* Dessinons n'ont nous ? */
	public boolean getDessine() {return this.dessine;}
	
	/* Permet de sp�cifier la position du crayon */
	public void setDessine(boolean d) {this.dessine = d;}

	//---------------------------------------------------------------
	/* Retourne la couleur du crayon */
	public Color getCouleur() {return this.couleur;}
	
	/* Permet de sp�cifier la couleur du crayon */
	public void setCouleur(Color c) {this.couleur = c;}
	
	/* Retourne la couleur du fond */
	public Color getFond() {return this.getBackground();}
	
	/* Permet de sp�cifier la couleur du fond d'�cran */
	public void setFond(Color c) {this.setBackground(c);}
	
	//---------------------------------------------------------------
	/* Modifie la tortue */
	public void setTortue(Point p, int cap) 
	{
		Tortue t = new Tortue(p,cap);
		this.remplacerDessinable(t,0);
		this.repaint();
	}
	
	//---------------------------------------------------------------
	/* Methode pour ajouter un dessin � la liste des dessins a afficher */
	public void ajouterDessinable(Dessinable d){dessins.add(d);}
	
	/* Methode pour remplacer un dessin dans la liste des dessins a afficher */
	public void remplacerDessinable(Dessinable d, int pos)
	{
		for (int i =0;i<dessins.size();i++)
		{
			if (dessins.get(i) instanceof Tortue)
			{
				dessins.removeElementAt(i);
				dessins.insertElementAt(d,dessins.size());
			}
		} 
	}

	//	enregistrer le panneau
	public void Enregistrer()
	{
		Rectangle zone = new Rectangle(0,0,this.getSize().width,this.getSize().height);
		try{
		capture = new Robot().createScreenCapture(zone);
		//recuperer les elements graphiques du panneau 
		Graphics g = capture.getGraphics();
		this.paint(g);
		}
		catch(AWTException e){
			e.printStackTrace();
		}
				
		try{ImageIO.write(capture, "PNG", new File("screen.png"));}
		catch(IOException e){e.printStackTrace();}
		System.out.println("image sauvegardee");
	}
	/*
	 * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
	 * Methode pour dessiner les objets du Vector<dessinable> dessins
	 */
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		for (int i =0;i<dessins.size();i++)
		{
			dessins.get(i).dessiner((Graphics2D) g);
		}
	}

}